package cn.xeblog.plugin.util;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.thread.GlobalThreadPool;

import java.util.ArrayList;
import java.util.List;

/**
 * 命令历史工具类
 *
 * @author anlingyi
 * @date 2022/7/10 9:04 PM
 */
public class CommandHistoryUtils {

  /**
   * 最大历史长度
   */
  private static final int MAX_SIZE = 15;

  /**
   * 历史列表
   */
  private static List<String> historyList = new ArrayList<>(MAX_SIZE);

  /**
   * 下一次的下标
   */
  private static int nextIndex;

  /**
   * 添加命令
   *
   * @param command 命令
   */
  public static void addCommand(String command) {
    GlobalThreadPool.execute(() -> {
      nextIndex = 0;
      int size = CollectionUtil.size(historyList);
      // 最后的下标
      int lastIndex = size - 1;
      // 如果最近输入的命令与现在的命令一样，跳过
      if (lastIndex > -1 && historyList.get(lastIndex).equals(command)) {
        return;
      }

      // 添加命令
      historyList.add(command);
      // 超出移出最前面的命令，也就是最早的命令
      if (size > MAX_SIZE) {
        historyList.remove(0);
      }
    });
  }

  /**
   * 获取下一个命令
   *
   * @return 命令
   */
  public static String getNextCommand() {
    nextIndex++;
    return getCurrentCommand();
  }

  /**
   * 获取上一个命令
   *
   * @return 命令
   */
  public static String getPrevCommand() {
    nextIndex--;
    return getCurrentCommand();
  }

  /**
   * 获取下标所在当前命令
   *
   * @return
   */
  public static String getCurrentCommand() {
    int size = CollectionUtil.size(historyList);
    // 没有历史记录
    if (size == 0) {
      return "";
    }
    // 下标没动过，即获取最近的命令
    if (nextIndex < 0) {
      nextIndex = size - 1;
    }
    // 下标已经超出了，即获取最早的命令
    if (nextIndex >= size) {
      nextIndex = 0;
    }

    return historyList.get(nextIndex);
  }

  /**
   * 设置命令集
   *
   * @param list 命令集
   */
  public static void setHistoryList(List<String> list) {
    if (list == null) {
      return;
    }

    historyList = list;
    nextIndex = 0;
  }

  /**
   * 获取命令历史列表
   *
   * @return 命令历史列表
   */
  public static List<String> getHistoryList() {
    return historyList;
  }

}
